讀取和修改資源 Move 還有兩個內置函數:borrow_global
和borrow_global_mut
。
在 ownership 篇章中,我們介紹了可變 (&mut)、不可變 (&) 引用,我們來應用在實際範例:
// modules/Collection.move
module Collection {
// added a dependency here!
use 0x1::Signer;
use 0x1::Vector;
struct Item has store, drop {}
struct Collection has key, store {
items: vector<Item>
}
// 拿到 Collection size
// 這邊用到了 acquires
public fun size(account: &signer): u64 acquires Collection {
let owner = Signer::address_of(account);
let collection = borrow_global<Collection>(owner);
Vector::length(&collection.items)
}
}
borrow_global
提供對資源 T 的不可變引用,schema 如下:
native fun borrow_global<T: key>(addr: address): &T;
通過上面範例,我們可以讀取儲存在特定地址的資源,但由於使用 borrow_global 無法返回對資源的引用或其內容
關鍵字acquires
放在函數返回值之後。此關鍵字明確定義此函數獲取的所有資源。
fun <name>(<args...>): <ret_type> acquires T, T1 ... {
要獲得對資源的可變引用,只需添加mut
到borrow_global
即可。
對資源的可變引用允許創建對其內容的可變引用。
module Collection {
// ... skipped ...
public fun add_item(account: &signer) acquires T {
let collection = borrow_global_mut<T>(Signer::address_of(account));
Vector::push_back(&mut collection.items, Item {});
}
}
讓我們 Move to Day 20